package com.jed.xxh.fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SynthesizerListener;
import com.jed.xxh.R;
import com.jed.xxh.adapter.ChatListAdapter;
import com.jed.xxh.entity.ChatListData;
import com.jed.xxh.utils.L;
import com.jed.xxh.utils.ShareUtil;
import com.jed.xxh.utils.StaticClass;
import com.jed.xxh.utils.T;
import com.kymjs.rxvolley.RxVolley;
import com.kymjs.rxvolley.client.HttpCallback;
import com.kymjs.rxvolley.client.HttpParams;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

/**
 * 项目名：stewardAPP<br/>
 * 包名：  com.jed.xxh.fragment<br/>
 * 文件名：ButlerFragment2<br/>
 * 作者：徐晓辉<br/>
 * 创建日期：2018/11/24 14:02<br/>
 * 描述：服务管家<br/>
 */
public class ButlerFragment extends Fragment implements View.OnClickListener {

    private ListView mChatListView;

    private List<ChatListData> mList = new ArrayList<>();
    private ChatListAdapter adapter;
    //输入框
    private EditText et_text;
    //发送按钮
    private Button btn_send;

    private SpeechSynthesizer mTts;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_butler, null);
        initView(view);
        return view;
    }

    //初始化View
    private void initView(View view) {


        //科大讯飞语音合成初始化
        //1.创建SpeechSynthesizer对象, 第二个参数：本地合成时传InitListener
        mTts = SpeechSynthesizer.createSynthesizer(getActivity(), null);
        //2.合成参数设置，详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类
        mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");//设置发音人
        mTts.setParameter(SpeechConstant.SPEED, "50");//设置语速
        mTts.setParameter(SpeechConstant.VOLUME, "80");//设置音量，范围0~100
        mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端
        //设置合成音频保存位置（可自定义保存位置），保存在“./sdcard/iflytek.pcm”
        //保存在SD卡需要在AndroidManifest.xml添加写SD卡权限
        //如果不需要保存合成音频，注释该行代码
        //mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");

        mChatListView = view.findViewById(R.id.mChatListView);
        et_text = view.findViewById(R.id.et_text);
        btn_send = view.findViewById(R.id.btn_send);
        btn_send.setOnClickListener(this);

        //设置适配器
        adapter = new ChatListAdapter(mList);
        mChatListView.setAdapter(adapter);
        addItem(getString(R.string.text_hello_tts), ChatListAdapter.VALUE_LEFT_TEXT);
    }

    //点击事件
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_send:
                sendMessage();
                break;
        }
    }

    /**
     * 发送消息并返回消息
     */
    private void sendMessage() {
        //1.获取输入框的内容
        String text = et_text.getText().toString();
        //2.判断是否为空
        if (!TextUtils.isEmpty(text)) {
            //3.判断长度不能大于30
            if (text.length() > 30) {
                T.showShortToast("长度超出了限制");
            } else {
                //4.清空当前的输入框
                et_text.setText("");
                //5.添加你输入的内容到item
                addItem(text, ChatListAdapter.VALUE_RIGHT_TEXT);
                //6.发送给机器人请求返回内容
                HttpParams params = new HttpParams();
                params.put("key", StaticClass.JH_CHAT_LIST_KEY);
                params.put("info", text);
                RxVolley.get(StaticClass.JH_CHAT_LIST_URL, params, new HttpCallback() {
                    @Override
                    public void onSuccess(String t) {
                        //7.拿到机器人的返回值之后添加在left item
                        L.i("Json" + t);
                        try {
                            JSONObject jsonObhect = new JSONObject(t);
                            JSONObject jsonresult = jsonObhect.getJSONObject("result");
                            //拿到返回值
                            String text = jsonresult.getString("text");
                            //7.拿到机器人的返回值之后添加在item
                            addItem(text, ChatListAdapter.VALUE_LEFT_TEXT);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        } else {
            T.showShortToast("输入不能为空");
        }
    }

    //添加文本
    private void addItem(String text, int leftOrRight) {
        Boolean isSpeak = ShareUtil.getBoolean("isSpeak", false);
        if (leftOrRight == ChatListAdapter.VALUE_LEFT_TEXT && isSpeak) {
            startSpeak(text);
        }
        ChatListData date = new ChatListData();
        date.setType(leftOrRight);
        date.setText(text);
        mList.add(date);
        //通知adapter刷新
        adapter.notifyDataSetChanged();
        //滚动到底部
        mChatListView.setSelection(mChatListView.getBottom());
    }

    private void startSpeak(String text) {
        mTts.startSpeaking(text, mSynListener);
    }

    /**
     * 实现SynthesizerListener接口
     */
    SynthesizerListener mSynListener = new SynthesizerListener() {

        /**
         * 开始播放 SDK回调此函数，通知应用层，将要进行播放。
         */
        @Override
        public void onSpeakBegin() {

        }

        /**
         * 缓冲进度 SDK回调此函数，通知应用层，当前合成音频的缓冲进度。
         * @param progress 缓冲进度0~100
         * @param beginPos 缓冲音频在文本中开始位置
         * @param endPos 表示缓冲音频在文本中结束位置
         * @param info 附加信息
         */
        @Override
        public void onBufferProgress(int progress, int beginPos, int endPos, String info) {

        }

        /**
         * 暂停播放
         */
        @Override
        public void onSpeakPaused() {

        }

        /**
         * 恢复播放
         */
        @Override
        public void onSpeakResumed() {

        }

        /**
         * 播放进度 SDK回调此接口，通知应用，当前的播放进度。
         * @param progress 播放进度0~100
         * @param beginPos 播放音频在文本中开始位置
         * @param endPos 播放音频在文本中结束位置
         */
        @Override
        public void onSpeakProgress(int progress, int beginPos, int endPos) {

        }

        /**
         * 会话结束 回调接口，没有错误是error为null
         * @param error 异常
         */
        @Override
        public void onCompleted(SpeechError error) {

        }

        /**
         * 合成会话事件 扩展用接口，由具体业务进行约定。
         * @param eventType
         * @param arg1
         * @param arg2
         * @param obj
         */
        @Override
        public void onEvent(int eventType, int arg1, int arg2, android.os.Bundle obj) {

        }
    };
}
